// DHCP Library v0.3 - April 25, 2009
// Author: Jordan Terrell - blog.jordanterrell.com

#ifndef Dhcp_h
#define Dhcp_h

/* DHCP state machine. */
#define STATE_DHCP_START  0
#define STATE_DHCP_DISCOVER  1
#define STATE_DHCP_REQUEST  2
#define STATE_DHCP_LEASED  3
#define STATE_DHCP_REREQUEST  4
#define STATE_DHCP_RELEASE  5

#define DHCP_FLAGSBROADCAST  0x8000

/* UDP port numbers for DHCP */
#define DHCP_SERVER_PORT  67  /* from server to client */
#define DHCP_CLIENT_PORT  68  /* from client to server */

/* DHCP message OP code */
#define DHCP_BOOTREQUEST  1
#define DHCP_BOOTREPLY    2

/* DHCP message type */
#define DHCP_DISCOVER    1
#define DHCP_OFFER    2
#define DHCP_REQUEST    3
#define DHCP_DECLINE    4
#define DHCP_ACK    5
#define DHCP_NAK    6
#define DHCP_RELEASE    7
#define DHCP_INFORM    8

#define DHCP_HTYPE10MB    1
#define DHCP_HTYPE100MB    2

#define DHCP_HLENETHERNET  6
#define DHCP_HOPS    0
#define DHCP_SECS    0

#define MAGIC_COOKIE    0x63825363
#define MAX_DHCP_OPT    16

#define HOST_NAME "WIZnet"
#define DEFAULT_LEASE  (900) //default lease time in seconds

#define DHCP_CHECK_NONE         (0)
#define DHCP_CHECK_RENEW_FAIL   (1)
#define DHCP_CHECK_RENEW_OK     (2)
#define DHCP_CHECK_REBIND_FAIL  (3)
#define DHCP_CHECK_REBIND_OK    (4)

enum
{
  padOption    =  0,
  subnetMask    =  1,
  timerOffset    =  2,
  routersOnSubnet    =  3,
  /* timeServer    =  4,
  nameServer    =  5,*/
  dns      =  6,
  /*logServer    =  7,
  cookieServer    =  8,
  lprServer    =  9,
  impressServer    =  10,
  resourceLocationServer  =  11,*/
  hostName    =  12,
  /*bootFileSize    =  13,
  meritDumpFile    =  14,*/
  domainName    =  15,
  /*swapServer    =  16,
  rootPath    =  17,
  extentionsPath    =  18,
  IPforwarding    =  19,
  nonLocalSourceRouting  =  20,
  policyFilter    =  21,
  maxDgramReasmSize  =  22,
  defaultIPTTL    =  23,
  pathMTUagingTimeout  =  24,
  pathMTUplateauTable  =  25,
  ifMTU      =  26,
  allSubnetsLocal    =  27,
  broadcastAddr    =  28,
  performMaskDiscovery  =  29,
  maskSupplier    =  30,
  performRouterDiscovery  =  31,
  routerSolicitationAddr  =  32,
  staticRoute    =  33,
  trailerEncapsulation  =  34,
  arpCacheTimeout    =  35,
  ethernetEncapsulation  =  36,
  tcpDefaultTTL    =  37,
  tcpKeepaliveInterval  =  38,
  tcpKeepaliveGarbage  =  39,
  nisDomainName    =  40,
  nisServers    =  41,
  ntpServers    =  42,
  vendorSpecificInfo  =  43,
  netBIOSnameServer  =  44,
  netBIOSdgramDistServer  =  45,
  netBIOSnodeType    =  46,
  netBIOSscope    =  47,
  xFontServer    =  48,
  xDisplayManager    =  49,*/
  dhcpRequestedIPaddr  =  50,
  dhcpIPaddrLeaseTime  =  51,
  /*dhcpOptionOverload  =  52,*/
  dhcpMessageType    =  53,
  dhcpServerIdentifier  =  54,
  dhcpParamRequest  =  55,
  /*dhcpMsg      =  56,
  dhcpMaxMsgSize    =  57,*/
  dhcpT1value    =  58,
  dhcpT2value    =  59,
  /*dhcpClassIdentifier  =  60,*/
  dhcpClientIdentifier  =  61,
  endOption    =  255
};

typedef struct _RIP_MSG_FIXED
{
  uint8_t  op;
  uint8_t  htype;
  uint8_t  hlen;
  uint8_t  hops;
  uint32_t xid;
  uint16_t secs;
  uint16_t flags;
  uint8_t  ciaddr[4];
  uint8_t  yiaddr[4];
  uint8_t  siaddr[4];
  uint8_t  giaddr[4];
  uint8_t  chaddr[6];
} RIP_MSG_FIXED;

#endif
